package com.ferryc.commons.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 日期时间处理工具类 ClassName: DateUtil <br/>
 * date: 2016年6月1日 下午4:26:02 <br/>
 * 
 * @author Lance.WU
 * @since JDK 1.6 platform 1.0
 */
public final class DateUtils extends org.apache.commons.lang3.time.DateUtils {
	/**
	 * 日志对象
	 */
	protected static Logger logger = LoggerFactory.getLogger(DateUtils.class);
	/** 日期时间格式 */
	public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
	/** 日期时间格式 */
	public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";
	/** 日期 格式 年月 */
	public static final String YYYYMM = "yyyyMM";
	/** 日期 格式 */
	public static final String YYYY_MM_DD = "yyyy-MM-dd";
	/** 日期 格式 */
	public static final String YYYYMMDD = "yyyyMMdd";
	/** 时间格式 */
	public static final String HHMMSS = "HHmmss";
	/** 时间格式 */
	public static final String HH_MM_SS_S = "hh:mm:ss.SS";

	/** 年月日时分秒毫秒 */
	public static final String YYYYMMDDHHMMSSSSS = "yyyyMMddHHmmssSSS";

	/** */
	private DateUtils() {

	}

	/**
	 * getCurrDate:(获取当前日期). <br/>
	 * 格式为：yyyyMMdd.<br/>
	 * 
	 * @return 返回结果：String <br/>
	 */
	public static String getCurrDate() {
		DateFormat df = new SimpleDateFormat(YYYYMMDD);
		return df.format(new Date());
	}

	/**
	 * getCurrDate:(获取当前日期). <br/>
	 * 格式为：自定义格式.<br/>
	 * 
	 * @param format
	 *            自定义格式 <br/>
	 * @return 返回结果：String <br/>
	 */
	public static String getCurrDate(String format) {
		DateFormat df = new SimpleDateFormat(format);
		return df.format(new Date());
	}

	/**
	 * getCurrDate:(获取当前日期). <br/>
	 * 格式为：自定义格式.<br/>
	 * 
	 * @param l
	 *            时间格式 <br/>
	 * @param format
	 *            自定义格式 <br/>
	 * @return 返回结果：String <br/>
	 */
	public static String getCurrDate(long l, String format) {
		DateFormat df = new SimpleDateFormat(format);
		return df.format(new Date(l));
	}

	/**
	 * getCurrDate:(获取当前日期). <br/>
	 * 格式为：自定义格式.<br/>
	 * 
	 * @param date
	 *            时间 <br/>
	 * @param format
	 *            自定义格式 <br/>
	 * @return 返回结果：String <br/>
	 */
	public static String getCurrDate(Date date, String format) {
		DateFormat df = new SimpleDateFormat(format);
		return df.format(date);
	}

	/**
	 * getCurrDate:(获取当前日期). <br/>
	 * 格式为：yyyyMMdd.<br/>
	 * 
	 * @param dateStr
	 *            时间字符串 <br/>
	 * @return 返回结果：Date <br/>
	 * @throws ParseException
	 *             转换异常 <br/>
	 */
	public static Date getCurrDateStr(String dateStr) throws ParseException {
		DateFormat df = new SimpleDateFormat(YYYYMMDD);
		return df.parse(dateStr);
	}

	/**
	 * getCurrTime:(获取当前日期). <br/>
	 * 格式为：hhMMss.<br/>
	 * 
	 * @return 返回结果：String <br/>
	 */
	public static String getCurrTime() {
		DateFormat df = new SimpleDateFormat("HHmmss");
		return df.format(new Date());
	}

	/**
	 * getCurrTime:(获取当前日期). <br/>
	 * 格式为：hhMMss.<br/>
	 * 
	 * @param format
	 *            格式化 <br/>
	 * @return 返回结果：String <br/>
	 */
	public static String getCurrTime(String format) {
		DateFormat df = new SimpleDateFormat(format);
		return df.format(new Date());
	}

	/**
	 * addDate:(计算时间格式). <br/>
	 * 
	 * @param date
	 *            时间 <br/>
	 * @param num
	 *            基数 <br/>
	 * @param calendarType
	 *            时间格式【Calendar:DATE 天数, DAY_OF_MONTH, YEAR,】 <br/>
	 * @return 返回结果：int 返回天数 <br/>
	 */
	public static Date addDate(Date date, int num, int calendarType) {
		Calendar sc = Calendar.getInstance();
		sc.setTime(date);
		sc.add(calendarType, num);
		return sc.getTime();
	}

	/**
	 * addDate:(计算时间格式). <br/>
	 * 
	 * @param date
	 *            时间 <br/>
	 * @param num
	 *            基数 <br/>
	 * @param calendarType
	 *            时间格式【Calendar:DATE 天数, DAY_OF_MONTH, YEAR,】 <br/>
	 * @return 返回结果：int 返回天数 <br/>
	 * @throws ParseException
	 *             转换失败
	 */
	public static Date addDate(String date, int num, int calendarType) throws ParseException {
		SimpleDateFormat sd = new SimpleDateFormat(YYYYMMDD);
		Calendar sc = Calendar.getInstance();
		sc.setTime(sd.parse(date));
		sc.add(calendarType, num);
		return sc.getTime();
	}

	/**
	 * addDate:(计算时间格式). <br/>
	 * 
	 * @param date
	 *            时间 <br/>
	 * @param num
	 *            基数 <br/>
	 * @param calendarType
	 *            时间格式【Calendar:DATE 天数, DAY_OF_MONTH, YEAR,】 <br/>
	 * @param formart
	 *            返回内容格式 <br/>
	 * @return 返回结果：int 返回天数 <br/>
	 */
	public static String addDate(Date date, int num, int calendarType, String formart) {
		Calendar sc = Calendar.getInstance();
		sc.setTime(date);
		sc.add(calendarType, num);
		SimpleDateFormat sd = new SimpleDateFormat(formart);
		return sd.format(sc.getTime());
	}

	/**
	 * 将当前 时间加两个小时返回
	 * 
	 *
	 * 传入字符串类型的数据
	 * 
	 * @return String
	 */

	@SuppressWarnings("static-access")
	public static String timeadd() {
		SimpleDateFormat format = new SimpleDateFormat("HH:mm");
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.HOUR_OF_DAY, 2);
		Date date = calendar.getTime();
		return format.format(date);
	}

	/**
	 * 将当前 时间加2分钟返回
	 * 
	 *
	 * 
	 * 
	 * @return String
	 */

	@SuppressWarnings("static-access")
	public static String timeMinueAdd() {
		SimpleDateFormat format = new SimpleDateFormat("HH:mm");
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MINUTE, 2);
		Date date = calendar.getTime();

		return format.format(date);
	}

	/**
	 * 
	 * 作用 ： 对Calendar对象进行format参数格式化<br/>
	 * 
	 * @param date
	 *            Calendar参数
	 * @param format
	 *            String类型格式化字符串
	 * @return - 被format格式后的时间字符串
	 */
	public static String getFormatDateTime(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME);
		if (null == date) {
			return "";
		}
		return sdf.format(date);
	}

	/**
	 * 
	 * 作用 ： 对Calendar对象进行format参数格式化<br/>
	 * 
	 * @param date
	 *            Calendar参数
	 * @param format
	 *            String类型格式化字符串
	 * @return - 被format格式后的时间字符串
	 */
	public static String getFormatDateTime(Date date, String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}

	/**
	 * 将原格式 的日期字符串，转换成新的格式
	 * 
	 * @Title: formatDateByFormat
	 * @Description: 将原格式 的日期字符串，转换成新的格式
	 * @Date May 3, 2014 21:23:41 PM
	 * @modifyDate May 3, 2014 21:23:41 PM
	 * @param date
	 *            日期对象 java.util.Date
	 * @param srcFormat
	 *            原格式 java.lang.String
	 * @param disFormat
	 *            目标格式 java.lang.String
	 * @return String 转换后的String日期
	 * 
	 *         <pre>
	 * 案例：
	 *    String result = formatDate("20150404",  "yyyyMMdd", "yyyy-MM-dd");
	 * 结果：result =  2015-04-04
	 * </pre>
	 * @since PlatForm 1.0
	 */
	public static String formatDate(String date, String srcFormat, String disFormat) {
		SimpleDateFormat srcSdf;
		if (StringUtil.isBlank(date)) {
			return "";
		}
		try {
			srcSdf = new SimpleDateFormat(srcFormat);
			// 将原日期转换成毫秒
			long srcDateTimes = srcSdf.parse(date).getTime();
			Date d = new Date();
			d.setTime(srcDateTimes);
			SimpleDateFormat sdf = new SimpleDateFormat(disFormat);
			return sdf.format(d);
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			return null;
		}
	}

	/**
	 * 
	 * @param dateStr
	 *            日期字符串
	 * @param type
	 *            类型
	 * @param addTime
	 *            增加时间
	 * @param format
	 *            模式
	 * @return String
	 */
	public static String addDate(String dateStr, int type, int addTime, String format) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		Date date = null;
		try {
			date = dateFormat.parse(dateStr);
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(date);
			calendar.add(type, addTime);
			Date nowDate = calendar.getTime();
			return dateFormat.format(nowDate);
		} catch (ParseException e) {
			logger.error(e.getMessage(), e);
			return null;
		}
	}

	/**
	 * 转换为时间（天,时:分:秒.毫秒）
	 * 
	 * @param timeMillis
	 * @return
	 */
	public static String formatDateTime(long timeMillis) {
		long day = timeMillis / (24 * 60 * 60 * 1000);
		long hour = (timeMillis / (60 * 60 * 1000) - day * 24);
		long min = ((timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60);
		long s = (timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
		long sss = (timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000);
		return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss;
	}

	/**
	 * 获取两个日期之间的天数
	 * 
	 * @param before
	 * @param after
	 * @return
	 */
	public static double getDistanceOfTwoDate(Date before, Date after) {
		long beforeTime = before.getTime();
		long afterTime = after.getTime();
		return (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
	}

	/**
	 * 获取过去的天数
	 * 
	 * @param date
	 * @return
	 */
	public static long pastDays(Date date) {
		long t = new Date().getTime() - date.getTime();
		return t / (24 * 60 * 60 * 1000);
	}

	/**
	 * 获取过去的小时
	 * 
	 * @param date
	 * @return
	 */
	public static long pastHour(Date date) {
		long t = new Date().getTime() - date.getTime();
		return t / (60 * 60 * 1000);
	}
}
